home *** CD-ROM | disk | FTP | other *** search
/ Languguage OS 2 / Languguage OS II Version 10-94 (Knowledge Media)(1994).ISO / language / parallax / ibm_pc_d.exe / SAMPLES / MATRIX.P < prev    next >
Text File  |  1992-11-06  |  1KB  |  60 lines

  1. SYSTEM  systolic_array;
  2. (* compute the matrix product "c := a * b" *)
  3. CONST max    = 10;
  4. TYPE  matrix = ARRAY [1..max],[1..max] OF REAL;
  5.  
  6. CONFIGURATION  grid [max],[max];
  7. CONNECTION     left:   grid[i,j]  ->  grid[i,(j-1) MOD max].left;
  8.                up:     grid[i,j]  ->  grid[(i-1) MOD max,j].up;
  9.                shiftA: grid[i,j]  ->  grid[i,(j-i) MOD max].shiftA;
  10.                shiftB: grid[i,j]  ->  grid[(i-j) MOD max,j].shiftB;
  11.  
  12. SCALAR i,j         : INTEGER;
  13.        a,b,c       : matrix;
  14.  
  15.  
  16. PROCEDURE matrix_mult(SCALAR VAR a,b,c : matrix);
  17. (* c := a * b *)
  18. SCALAR k: INTEGER;
  19. VECTOR ra,rb,rc : REAL;
  20. BEGIN
  21.   LOAD (ra,a);
  22.   LOAD (rb,b);
  23.   PARALLEL
  24.     PROPAGATE.shiftA(ra);
  25.     PROPAGATE.shiftB(rb);
  26.     rc := ra * rb;
  27.     FOR k := 2 TO max DO
  28.       PROPAGATE.left(ra);
  29.       PROPAGATE.up(rb);
  30.       rc := rc + ra * rb;
  31.     END;
  32.   ENDPARALLEL;
  33.   STORE(rc,c);
  34. END matrix_mult;
  35.  
  36.  
  37. PROCEDURE out(SCALAR VAR a: matrix);
  38. SCALAR i,j: CARDINAL;
  39. BEGIN
  40.   FOR i:=1 TO max DO
  41.     FOR j:=1 TO max DO WriteFixPt(a[i,j], 10,2) END;
  42.     WriteLn
  43.   END;
  44.   WriteLn
  45. END out;
  46.  
  47. BEGIN
  48.   (* preset input matrices "a" and "b" (or read them from a file instead) *)
  49.   FOR i:=1 TO max DO
  50.     FOR j:=1 TO max DO
  51.       a[i,j]:=FLOAT(10*i+j);
  52.       b[i,j]:=FLOAT(i+j);
  53.    END;
  54.   END;
  55.   out(a); out(b);
  56.   matrix_mult(a,b,c);
  57.   out(c);                (* print result matrix "c" *)
  58. END systolic_array.
  59.  
  60.